package com.example.demo;

/**
 * @创建人 lIUJF
 * @创建时间 2019/1/15
 * @描述: 演示令牌桶算法， 令牌桶对业务有一定的容忍度（峰值）
 */
public class TokenBuckt {
	private int bucketNums = 100;        //桶的容量
	private int rate = 1;                //流入速度
	private int nowTokens;                //当前令牌数
	private long timestamp = getNowTime();             //时间

	private long getNowTime(){
		return System.currentTimeMillis();
	}

	private int getMinTokens(int tokens){
		if (bucketNums > tokens) {
			return tokens;
		} else {
			return bucketNums;
		}
	}

	public boolean getToken(){
		//记录来拿令牌的时间
		long nowTime = getNowTime();
		//添加令牌【判断该有多少令牌】 令牌数+=当前令牌数+时间内的流入令牌数量
		System.out.println("一   " + nowTokens);

		nowTokens = nowTokens + (int) (nowTime - timestamp) * rate;
		//添加以后的令牌数量与桶的容量哪个小
		nowTokens = getMinTokens(nowTokens);
		System.out.println("二   " + nowTokens);
		//修改拿令牌的时间
		timestamp = nowTime;
		//判断令牌是否足够
		if (nowTokens < 1) {
			return false;
		} else {
			nowTokens -= 1;
			return true;

		}
	}

	public static void main(String[] args){
		TokenBuckt tokenBuckt = new TokenBuckt();
		for (int i = 0; i < 100; i++) {
			if (i == 10) {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println("第" + i + "次请求结果" + tokenBuckt.getToken());
		}
	}
}
